package org.alps.pattern.singleton.lazy;

/**
 * @date 2021-04-30
 * @author zkw
 */
public class LazyDoubleCheckSingleton {
    private LazyDoubleCheckSingleton(){}

    private volatile static LazyDoubleCheckSingleton lazy = null;

    /**
     * 双重检查锁
     * CPU执行时会转换成JVM指令执行
     * 1.分配内存给这个对象
     * 2.初始化对象
     * 3.将初始化好的对象和内存地址建立关联，赋值
     * 第2、3两步顺序可能切换（指令重排序问题 --> 通过volatile关键字解决）
     * 4.用户初次访问
     * @return
     */
    public  static LazyDoubleCheckSingleton getInstance() {
        if (lazy == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazy == null) {
                    lazy = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazy;
    }
}
